//
//  main.m
//  OC05_NSArray_NSDictionary_NSSet
//
//  Created by Rain on 16/1/29.
//  Copyright © 2016年 Rain. All rights reserved.
//

#import <Foundation/Foundation.h>

/** 知识点: NSArray 不可变数组. */
void chapterOfNSArray() {

    /** 数组是一个有序集合, 只能存放对象类型. */
    
    /** 不可变数组: 数组创建好之后, 数组内的元素不能发生改变. */
    
    /** 初始化 */
    NSArray *arr = [[NSArray alloc] initWithObjects:@"dalian", @"shenyang", @"beijing", nil];
    
    NSLog(@"arr:%@", arr);
    
    
    
    /** 便利构造器 */
    NSArray *arr2 = [NSArray arrayWithObjects:@"dalian", @"shenyang", @"beijing", nil];
    NSLog(@"arr2:%@", arr2);
    
    /** 字面量 */
    NSArray *arr3 = @[@"dalian", @"shenyang", @"beijing"];
    NSLog(@"arr3:%@", arr3);
   
    /** 字面量方式获取数组元素 */
    NSString *sy = arr3[1];
    NSLog(@"sy:%@", sy);

    /** API: */
    /** 获取数组元素个数 */
    NSLog(@"count:%ld", arr3.count);
    
    
    /** 获取数组中指定下标对应的元素 */
    NSString *objc = [arr3 objectAtIndex:1];
    

    /** 用来判断数组中是否包含某一个给定的对象 */
    if ([arr3 containsObject:@"shenyang"]) {
        NSLog(@"包含");
    } else {
        NSLog(@"不包含");
    }

    /** 获取数组元素对应的索引 */
    NSLog(@"%ld", [arr3 indexOfObject:@"Tom"]);
 
    
    /** 按照给定的字符串进行截取，将截取的多段字符串放入数组中 */
    
    NSString *str = @"www.lanou3g.com";
    
    NSArray *comArr = [str componentsSeparatedByString:@"."];
    NSLog(@"comArr:%@", comArr);
 
    
    /** 练习: 有一个字符串(www.lanou3g.com)，通过.进行分割. */
    
    /** 将数组中的元素按照给定的字符串格式拼接成一个完整的字符串对象 */

    /** 练习: 有一个数组，通过&将所有元素拼接成一个字符串. */
    
    
    /** 练习: 存在如下的字符串，将其中的图片的网址提取出来。
     “http://www.imanhua.com/Cover/2011-10/hyrz.jpg&http://www.imanhua.com/Cover/2011-09/op.jpg&http://www.imanhua.com/Cover/2012-04/yjdwb.jpg */
    
    
    
    /** 练习: 有如下一个数组，@[@“type = iOS", @"Device = iPhone", @"count = 11344115@163.com", @"password = 12345”]，将其中的内容用”&"符号拼接成一个字符串. */
    NSArray *q = @[@"type = iOS", @"Device = iPhone", @"count = 11344115@163.com", @"password = 12345"];
    
    NSString *qStr = [q componentsJoinedByString:@"&"];
    NSLog(@"qStr:%@", qStr);

}

/** 知识点: NSMutableArray 可变数组. */
void chapterOfNSMutableArray() {
    
    /** 初始化() */
    
    /** 便利构造器 */
    
    /** 字面量 */
    NSMutableArray *mArr = @[@"dalian", @"shenyang", @"beijing"].mutableCopy;
    
    /** 数组中添加一个对象 add */
    [mArr addObject:@"shanghai"];
    
    /** 数组中指定位置插入一个对象 insert */
    [mArr insertObject:@"dalian" atIndex:0];
    
    /** 数组中移除一个对象 remove */
    [mArr removeObject:@"dalian"];
    NSLog(@"%@", mArr);
    
    
    /** 移除数组中最后一个对象 remove */
    [mArr removeLastObject];

    
    
    /** 移除数组中所有的元素 */
//    [mArr removeAllObjects];
    
    
    /** 数组中移除指定位置的元素 */
    [mArr removeObjectAtIndex:1];

    
    /** 使用指定的对象替换指定位置的对象 replace */
    [mArr replaceObjectAtIndex:0 withObject:@"dalian"];
   
    /** 交换指定的两个下标对应的对象  exchage */
//    [mArr exchangeObjectAtIndex:0 withObjectAtIndex:1];
    
    /**
     * 练习: 定义一个数组完成以下操作
     (1)向数组中添加三个名字。
     (2)从数组中查找指定的名字，并且用另外一个名字替换该姓名。
     (3)删除指定的名字。
     */
    
}

/** 知识点: NSDictionary 不可变字典. */
void chapterOfNSDictionary() {
    
    /**
     * 字典是一个无序的集合，用来存储具有一一对应关系的数据。
     * 字典中存储的每一个对象都是一对键值对，键值对包含两个部分key和value，key与value的值都是对象类型。
     * 对于每一对key－value称为一个条目(Entry)。
     */
    
    /** 初始化 */
    NSDictionary *dic = [[NSDictionary alloc] initWithObjectsAndKeys:@"Tom",@"name",@"male", @"sex", @"20", @"age",nil];
    

    /** 便利构造器 */
    NSDictionary *dic2 = [NSDictionary dictionaryWithObjectsAndKeys:@"Tom", @"name", @"male", @"sex", @"20", @"age", nil];
    
    NSDictionary *dic3 = [NSDictionary dictionaryWithDictionary:dic];
    
    NSLog(@"dic3:%@", dic3);
    
    /** 字面量 */
    NSDictionary *dic4 = @{@"name":@"Tom",
                           @"age" :@"20",
                           @"sex" :@"male"};

    /** 获取字典中键值对的个数 */
    NSLog(@"count:%ld", dic4.count);
    

    /** 获取字典中所有的键 */
    NSArray *arrOfKeys = dic4.allKeys;
    
    
    /** 获取字典中所有的值 */
    NSArray *arrOfValue = dic4.allValues;
    
    /** 根据键获得对应的值 */
    
    NSString *sex = [dic4 objectForKey:@"sex"];
    NSLog(@"sex:%@", sex);

}

/** 知识点: NSMutableDictionary 可变字典. */
void chapterOfNSMutableDictionary() {
    
    /** 初始化 */
    NSMutableDictionary *mDic = [[NSMutableDictionary alloc] initWithCapacity:26];
    
    
    /** 便利构造器 */
    NSMutableDictionary *mDic2 = [NSMutableDictionary dictionaryWithCapacity:26];
    

    /** 字面量 */
    NSMutableDictionary *mDic3 = @{@"name":@"tom",@"age":@"20",@"sex":@"male"}.mutableCopy;

    
    /** 字典中添加新的键值对以或者修改某一对键值对 */
    [mDic3 setObject:@"001" forKey:@"number"];
    [mDic3 setObject:@"Tom" forKey:@"name"];
    

    /** 移除指定的键对应的键值对 */
    [mDic3 removeObjectForKey:@"sex"];
    
    /** 移除字典中所有的键值对 */
    
    
    /**
     * 练习: 完成以下需求:
     1、
     定义通讯录类(AddressBook)类, 定义联系人类Contact。实例变量：姓名(拼音，首字母大写)、性别、电话号码、住址、分组名称、年龄。方法：自定义初始化方法(姓名、电话号码)、显示联系人信息。

     2. 在main中创建一个通讯录对象, 实现添加联系人, 删除联系人对象, 获取某个分组下所有的联系人.
     */
}

/** 知识点: NSSet 不可变集合. */
void chapterOfNSSet() {
    
    /**
     * 互异性(唯一性)  集合中不能够存在两个相同的对象。
     * 无序性  集合中的对象没有顺序，先添加的对象不一定在集合中的第一个位置，后添加的也不一定在最后的位置。
     * 多用于重用池, 执行效率比数组高, 且可以避免重复元素
     
     */
    
    /** 初始化 */
    NSSet *set = [[NSSet alloc] initWithObjects:@"tom", @"zhang", @"tom", nil];
    
    NSLog(@"set:%@", set);
    
    /** 便利构造器 */
    NSSet *set2 = [NSSet setWithObjects:@"tom", @"zhang", @"lisi", @"tom", nil];
    
    /** 获取集合中对象的个数 */
    NSLog(@"count:%ld", [set count]);
    
    /** 获取集合中所有的对象 */
    NSArray *arrOfObjs = set.allObjects;
    
    /** 从集合中取出一个对象 */
    NSString *obj = [set anyObject];
    
    /** 判断集合中是否包含某一个指定的对象 */
    [set containsObject:@"zhao"];
        /** 没有字面量 */
}

/** 知识点6: NSMutableSet 可变集合. */
void chapterOfNSMutableSet() {
    /** 初始化 */
    
    /** 便利构造器 */
    
    /** 添加一个对象 */
    
    /** 移除一个对象 */
    
    /** 移除所有对象 */
}

/** 限时代码. */
void limitTimeCoded() {
    
    
}

/** 阅读资料. */
void resource() {
    
    
}


#pragma mark - MAIN FUNCTION
int main(int argc, const char * argv[]) {
    
#pragma mark - 知识点1. NSArray 不可变数组
    chapterOfNSArray();
    
#pragma mark - 知识点2. NSMutableArray 可变数组
    chapterOfNSMutableArray();
    
#pragma mark - 知识点3. NSDictionary 不可变字典
    chapterOfNSDictionary();
    
#pragma mark - 知识点4. NSMutableDictionary 可变字典
    chapterOfNSMutableDictionary();
    
#pragma mark - 知识点5. NSSet 不可变集合
    chapterOfNSSet();
    
#pragma mark - 知识点6. NSMutableSet 可变集合
    chapterOfNSMutableSet();
    
#pragma mark - 限时代码.
    limitTimeCoded();
    
#pragma mark - 阅读资料.
    resource();
    
    return 0;
}











